import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
// 获取参数的TS类型
import { Request, Response, NextFunction } from 'express';
import { NestExpressApplication } from '@nestjs/platform-express';
import { join } from 'path';
import { Response as MyResponse } from './common/response';
import { HttpFilter } from './common/filter';
import { ValidationPipe } from '@nestjs/common';
import { RoleGuard } from './guard/role.guard';
import { Reflector } from '@nestjs/core';

// 中间件使用案例： 白名单
const whiteRoute = ['/list', '/upload'];
// 全局中间件
function MiddleWareAll(req: Request, res: Response, next: NextFunction) {
  // req.originalUrl请求地址
  console.log(req.originalUrl);
  console.log('全局中间件');
  // 白名单通行
  if (whiteRoute.includes(req.originalUrl)) {
    console.log('白名单接口');
    next();
  } else {
    // 不是白名单统一响应： 不是白名单
    // res.send('不是白名单接口');
    console.log('不是白名单接口');
    next();
  }
}

async function bootstrap() {
  // 配置cors跨域
  // NestExpressApplication，导入泛型获取代码提示
  const app = await NestFactory.create<NestExpressApplication>(AppModule, {
    cors: true,
  });
  // useStaticAssets配置静态资源目录：(传参)传入静态文件地址
  // join拼接路径，__dirname: 当前所在目录的绝对路径，这里就会拼接成：D:\JavaScript\project-name\dist\images
  // 为什么是dist文件，因为运行时状态是打包的，所以根路径是dist文件夹
  app.useStaticAssets(join(__dirname, 'images'), {
    // 用户访问：默认访问地址为 localhost:3000，配置路径前缀，localhost:3000/flie/文件名
    prefix: '/flie',
  });
  console.log('jon', join(__dirname, '../images'));

  // 挂载全局中间件
  // app.use(MiddleWareAll);

  // 挂载全局响应拦截器
  app.useGlobalInterceptors(new MyResponse());

  // 挂载全局异常拦截器
  app.useGlobalFilters(new HttpFilter());

  // 挂载全局请求参数验证
  app.useGlobalPipes(new ValidationPipe());

  // 挂载全局守卫（验证权限、token）
  // app.useGlobalGuards(new RoleGuard(new Reflector()));

  await app.listen(3000);
}
bootstrap();
